﻿using System;
using System.Collections.Generic;//泛型集合的命名空间
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _49泛型集合
{
    internal class Program
    {
        //List<T>  列表  类似一个长度可变的数组       内部用数组实现
        private static void Main1(string[] args)
        {
            List<string> bookList = new List<string>();
            //必须先添加元素才能根据索引访问
            bookList.Add("论语");//0
            bookList.Add("大学");//1
            bookList.Add("中庸");//2
            bookList.Add("孟子");//3
            bookList.Add("儿歌三百首");

            for (int i = 0; i < bookList.Count; i++)
            {
                Console.WriteLine(bookList[i]);

                if (bookList[i] == "中庸")
                {
                    bookList.RemoveAt(i); //i不减1无法在移除前面的代码中访问到i的下一个元素
                    //i--;
                }

                if (bookList[i] == "孟子")
                {
                    bookList[i] = "XX";
                }
            }

            Console.WriteLine("------------------------");

            foreach (var item in bookList)
            {
                Console.WriteLine(item);
            }
        }

        //Dictionary<T> 字典  以键值对存数据   哈希算法实现
        private static void Main2(string[] args)
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            //添加元素,键必须唯一
            dic.Add("主机", "192.168.111.222");
            dic.Add("用户名", "admin");

            Console.WriteLine(dic["主机"]);//给键取值

            // //不能用for只能用foreach
            // foreach (var item in dic) //直接遍历字典item是键值对
            // {
            //     Console.WriteLine(item.Key + ":" + item.Value);
            // }

            foreach (var item in dic.Keys)
            {
                Console.WriteLine(item + ":" + dic[item]);
            }

            //如果不存在端口这个键就返回默认值21
            string port;
            //TryGetValue
            //if (dic.TryGetValue("端口", out port))
            //{
            //}
            //else
            //{
            //    port = "21";
            //}

            if (dic.ContainsKey("端口"))
            {
                port = dic["端口"];
            }
            else
            {
                port = "21";
            }
        }

        //Stack<T> 栈 先进后出   内部数组实现

        private static void Main3(string[] args)
        {
            Stack<int> stack = new Stack<int>();

            //入栈
            stack.Push(1);
            stack.Push(2);
            stack.Push(3);

            //出栈   返回并移除栈顶部的元素
            // Console.WriteLine(stack.Pop());//3
            // Console.WriteLine(stack.Pop());//2

            // while (stack.Count > 0)
            // {
            //     int n = stack.Pop();
            //     Console.WriteLine(n);
            // }

            //Peek 只返回不移除栈顶的元素
        }

        //Queue队列  先进先出  内部数组实现
        private static void Main4(string[] args)
        {
        }
        //队列
        private static void Main5(string[] args)
        {
        }
        //链表
        private static void Main6(string[] args)
        {
            LinkedList<int> linkedList = new LinkedList<int>();

            linkedList.AddLast(1);
            var node2 = linkedList.AddLast(2);//会自动创建节点并返回节点
            var node3 = new LinkedListNode<int>(3);//自己创建节点
            linkedList.AddLast(node3);//添加节点
            linkedList.AddLast(4);
            var node5 = linkedList.AddFirst(5);

            // //全部遍历
            // foreach (var item in linkedList)
            // {
            //     Console.WriteLine(item);
            // }

            //从指定节点到另一个节点遍历 从node5到node3
            var node = node5;
            while (true)
            {
                //处理节点的数据
                Console.WriteLine(node.Value);

                //判断是否跳出
                if (node == node3)
                {
                    break;
                }
                //继续下一个节点
                node = node.Next;
            }
        }

        //HashSet 去重 类似字典的键部分
        private static void Main(string[] args)
        {
            HashSet<int> set = new HashSet<int>();
            set.Add(2);
            set.Add(3);
            set.Add(3);
            set.Add(4);

            foreach (var item in set)
            {
                Console.WriteLine(item);
            }
            //234
        }
    }
}